/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package model.funcionario;
import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import model.excecoes.ErroDAOException;
import model.excecoes.ErroNegocioException;
import model.interfaces.INegocioFuncionario;
import model.factory.Factory;
/**
 *
 * @author Marcos
 */
public class NegocioFuncionario implements INegocioFuncionario{

    private RepositorioFuncionario repFunc = null;
    
    public NegocioFuncionario(){
        repFunc = Factory.getFuncionarioDAO();
    }
    
    private boolean verificarExistencia(String cpf)throws ErroDAOException, PersistenceException, NoResultException{
        return repFunc.verificarExistencia(cpf);
    }
    
    @Override
    public void cadastrarFuncionario(Funcionario funcionario) throws ErroDAOException, PersistenceException, NoResultException, ErroNegocioException {
        
        if(verificarExistencia(funcionario.getCpf())){
            throw new ErroNegocioException("Funcionário já cadastrado.\nPor favor informe os dados corretos ou cancele a operação.");
        }
        
        
        if(funcionario.getNome().length() > 300){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Nome só aceita até 300 caracteres.");
        }
        
        if(funcionario.getEndereco().getRua().length() > 300){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Rua só aceita até 300 caracteres.");
        }
        
        if(funcionario.getEndereco().getCidade().length() > 200){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Cidade só aceita até 200 caracteres.");
        }
        
        if(funcionario.getEndereco().getBairro().length() > 100){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Bairro só aceita até 100 caracteres.");
        }
        
        
        if(funcionario.getEndereco().getCep().length() > 20){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CEP só aceita até 20 caracteres.");
        }
        
        if(funcionario.getEndereco().getComplemento().length() > 300){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Complemento só aceita até 300 caracteres.");
        }
        
        if(funcionario.getEndereco().getUf().length() > 70){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo UF só aceita até 70 caracteres.");
        }
        
        if(funcionario.getRg().length() > 20){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo RG só aceita até 20 caracteres.");
        }
        
        if(funcionario.getCpf().length() > 20){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CPF só aceita até 20 caracteres.");
        }
        
        if(funcionario.getLogin().length() > 200){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Login só aceita até 200 caracteres.");
        }
        
        if(funcionario.getSenha().length() > 200){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Senha só aceita até 200 caracteres.");
        }
        
        if(funcionario.getFuncao().length() > 70){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Função só aceita até 70 caracteres.");
        }
        
        if(funcionario.getContato().getTelefone().length() > 30){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Telefone só aceita até 30 caracteres.");
        }
        
        if(funcionario.getContato().getCelular().length() > 30){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Celular só aceita até 30 caracteres.");
        }
        
        if(funcionario.getContato().getEmail().length() > 100){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo E-Mail só aceita até 100 caracteres.");
        }
        
        repFunc.cadastrar(funcionario);
    }

    @Override
    public void alterarFuncionario(Funcionario funcionario) throws ErroDAOException, PersistenceException, NoResultException, ErroNegocioException {
        boolean verify = verificarExistencia(funcionario.getCpf());
        if(!verify){
            throw new ErroNegocioException("Foi Mal!");
        }
        
        if(funcionario.getNome().length() > 300){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Nome só aceita até 300 caracteres.");
        }
        
        if(funcionario.getEndereco().getRua().length() > 300){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Rua só aceita até 300 caracteres.");
        }
        
        if(funcionario.getEndereco().getCidade().length() > 200){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Cidade só aceita até 200 caracteres.");
        }
        
        if(funcionario.getEndereco().getBairro().length() > 100){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Bairro só aceita até 100 caracteres.");
        }
        
        
        if(funcionario.getEndereco().getCep().length() > 20){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CEP só aceita até 20 caracteres.");
        }
        
        if(funcionario.getEndereco().getComplemento().length() > 300){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Complemento só aceita até 300 caracteres.");
        }
        
        if(funcionario.getEndereco().getUf().length() > 70){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo UF só aceita até 70 caracteres.");
        }
        
        if(funcionario.getRg().length() > 20){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo RG só aceita até 20 caracteres.");
        }
        
        if(funcionario.getCpf().length() > 20){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo CPF só aceita até 20 caracteres.");
        }
        
        if(funcionario.getLogin().length() > 200){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Login só aceita até 200 caracteres.");
        }
        
        if(funcionario.getSenha().length() > 200){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Senha só aceita até 200 caracteres.");
        }
        
        if(funcionario.getFuncao().length() > 70){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Função só aceita até 70 caracteres.");
        }
        
        if(funcionario.getContato().getTelefone().length() > 30){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Telefone só aceita até 30 caracteres.");
        }
        
        if(funcionario.getContato().getCelular().length() > 30){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo Celular só aceita até 30 caracteres.");
        }
        
        if(funcionario.getContato().getEmail().length() > 100){
            throw new ErroNegocioException("O número de caracteres excedeu o limite.\nO Campo E-Mail só aceita até 100 caracteres.");
        }
        
        repFunc.alterar(funcionario);
    }

    @Override
    public void excluirFuncionario(Funcionario funcionario) throws ErroDAOException, PersistenceException, NoResultException, ErroNegocioException {
        if(verificarExistencia(funcionario.getCpf()) == false){
            throw new ErroNegocioException("Funcionário não encontrado.\nPor favor insira os dados corretos ou cancele a operação.");
        }
        
        repFunc.excluir(funcionario);
    }

    @Override
    public List<Funcionario> listarFuncionario(String consulta, String campo) throws ErroDAOException, PersistenceException, NoResultException, ErroNegocioException {
        List<Funcionario> funcionarios = repFunc.listarFuncionario(consulta, campo);
        
        if(!consulta.equals("Todos") && !campo.equals("Todos")){
            if(funcionarios.isEmpty()){
                throw new ErroNegocioException("Funcionário não cadastrado.\nPor favor cadastre-o(a) ou cancele a operação.");
            }
        }
        
        return funcionarios;
    }

    @Override
    public Funcionario logarFuncionario(String login, String senha) throws ErroDAOException, PersistenceException, NoResultException, ErroNegocioException {
        if(login == null || login.equals("")){
            throw new ErroNegocioException("O Campo login é um campo obrigatório portanto não pode ficar vazio.");
        }
        
        if(senha == null || senha.equals("")){
            throw new ErroNegocioException("O Campo Senha é um campo obrigatório portanto não pode ficar vazio.");
        }
        
        Funcionario funcionario = repFunc.logarFuncionario(login, senha);
        
        if(funcionario == null){
            throw new ErroNegocioException("Login inválido.\nTente novamente ou cancele a operação!");
        }
        
        return funcionario;
    }
    
}
